#define _CRT_SECURE_NO_WARNINGS


#include <iostream>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;

// 按照元素绝对值从小到大 依次消除
#define MAX_N 100000
long long arr[MAX_N + 5];

typedef pair<int, int> PII; //绝对值 和 下标
set<PII> h;

int l[MAX_N + 5] = { 0 }, r[MAX_N + 5] = { 0 }; //前一位元素下标存在L中 
int st[MAX_N + 5];// 标记当前结点


void del(int x) 
{
	r[l[x]] = r[x];
	l[r[x]] = l[x];
	st[x] = 1;
}


int main()
{
	int n, m;
	int k = 1;
	scanf("%d%d", &n, &m);
	scanf("%lld", arr + 1);

	for (int i = 1, a; i < n; i++)
	{
		scanf("%d", &a); 
		//判断是否同号
		if (1LL * arr[k] * a < 0) arr[++k] = a;
		else arr[k] += a; //合并同号连续元素
	}
	int cnt = 0, S = 0;
	n = k;
	for (int i = 1; i <= n; i++)
	{
		if (arr[i] > 0) //统计所有正数和
		{
			cnt += 1;
			S += arr[i];
		}

		// 获取绝对值最小的结点 ，需要构建小顶堆
		h.insert(PII(abs(arr[i]), i));

		l[i] = i - 1;
		r[i] = i + 1;
	}

	// 每一轮减少一个正数
	while (cnt > m)
	{
		while (st[h.begin()->second]) h.erase(h.begin());
		int ind = h.begin()->second; //获取当前最小值结点下标
		
		h.erase(h.begin());

		int left = l[ind], right = r[ind];

		if ((left > 0 && right <= n) || arr[ind] > 0)
		{
			S -= abs(arr[ind]);
			cnt -= 1;

			// 合并三个结点为1个结点
			arr[ind] += arr[left] + arr[right];
			h.insert(PII(abs(arr[ind]), ind));
			del(left);
			del(right);
		}
	}

	cout << S << endl;

	return 0;
}
